用例

你想复制复制多个文件至远程的不同目录,一般使用scp。但scp不允许你在一条命令上指定多个目标地址,所以只好使用多条scp命令。

scp -v /file/source1/* username@host_server:/file/destination1
scp -v /file/source2/* username@host_server:/file/destination2
scp -v /file/source3/* username@host_server:/file/destination3

怎样用一条命令复制多个文件至远程的不同目录?

方案一

最简单的方案是使用SSHFS映射远程地址到本地,然后用cp命令。这需要访问SFTP。

mkdir host_server
sshfs username@host_server:/file host_server
cp /file/source1/* host_server/destination1
cp /file/source2/* host_server/destination2
cp /file/source3/* host_server/destination3
fusermount -u host_server
rmdir host_server

方案二

另一个方案是,先在本地整理好文件,然后复制整个结构。这需要rsync

mkdir destination1 destination2 destination3
ln -s /file/source1/* destination1
ln -s /file/source2/* destination2
ln -s /file/source3/* destination3
rsync -a --copy-unsafe-links destination1 destination2 destination3 username@host_server:/file
rm -r destination1 destination2 destination3

方案三

第三个是继续使用scp,但需要先开通一个master connection指向服务器。
在~/.ssh/config中加入

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

如果你你启动一个与既存的连接的指向(user, port, machine)相同的ssh session,第二个session会被隧道化至第一个。建立第二个连接无需再次认证,并且速度很快。

方案四

你可以继续使用scp,但避免每次都输入用户名密码。
创建一个key pair,然后把私钥注入key agent ssh-add ~/.ssh/id_rsa,这样你在每次连接时就无需键入任何内容了。

不过方案三和方案四只是折中方案。

参考:https://unix.stackexchange.co...


执着的慢行者
223 声望21 粉丝

大型电子商务系统架构师、项目管理专家